Technote 1147

Pending Update Perils


 

ñ⁄éü

ÇÕÇ∂ÇflÇ…

çXêVÇΔ ModalDialog

ñ‚ëËÇâÒîÇ∑ÇÈãÔëÃìIÇ»ï˚ñ@

Ç≥ÇÁÇ…ïKóvÇΔÇ»ÇÈèàóù

åãò_

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇÃîwå„DždžÇÈÉEÉCÉìÉhÉEÇ…ëŒÇµÇƒçXêVÉCÉxÉìÉgÇÃÉyÉìÉfÉBÉìÉOÇ™íÒãüÇ≥ÇÍǃǢǻǢÇΔÇ´Ç…ãNDZÇËǧÇÈñ‚ëËDžǬǢǃê‡ñæÇµÇ‹Ç∑ÅB

ÇÕÇ∂ÇflÇ…

ÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇÕDZÇÍÇ‹Ç≈ÅAǪÇÃîwå„DždžÇÈÉEÉCÉìÉhÉEÇ…ä÷òAǵÇΩÇ¢Ç≠ǬǩÇÃñ‚ëËÇÃå¥àˆÇ…ǻǡǃǴNjǵÇΩÅBModalDialog ÇÕÅAÉfÉtÉHÉãÉgÇÃê›íËÇ≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉCÉxÉìÉgÉãÅ[ÉvÇΔã¶í≤ìIÇ…ìÆçÏǵǻǢìΔé©ÇÃÉCÉxÉìÉgÉãÅ[ÉvÇéùǡǃǢÇÈÇΩÇflÅAModalDialog ÉãÅ[ÉvÇ…ì¸Ç¡ÇƒÇ¢ÇÈÇΔÇ´Ç…ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìì‡ÇÃëºÇÃÉEÉCÉìÉhÉEÇ…çXêVÇ™î≠ê∂ǵÇΩDZÇΔÇê≥ǵÇ≠îFéØÇ≈ǴǻǢâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅB

ÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇ…ëŒÇ∑ÇÈÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉÇèëÇ¢ÇΩåoå±ÇÃdžÇÈÉfÉxÉçÉbÉpÇ»ÇÁÅAǮǪÇÁÇ≠DZÇÃñ‚ëËÇÇ∑Ç≈Ç…åoå±ÇµÇƒÇ¢ÇÈÇÕÇ∏Ç≈Ç∑ÅBÉtÉBÉãÉ^ÇÕçXêVÉCÉxÉìÉgÇÃífë±ìIÇ»ÉXÉgÉäÅ[ÉÄÇéÊìæÇµÇ‹Ç∑ÅBDZÇÍÇÁÇÃÉCÉxÉìÉgÇÕÉ_ÉCÉAÉçÉOÇ…ëŒÇ∑ÇÈLJÇÃÇ≈ÇÕÇ»Ç≠ÅAÉ_ÉCÉAÉçÉOÇÃîwå„DždžÇÈÉEÉCÉìÉhÉEÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇËÅADZÇÍÇÁÇÃÉEÉCÉìÉhÉEÇÕÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇ™ç≈ëOñ Ç…džÇÈÇΩÇflçXêVÇ≥ÇÍÇ‹ÇπÇÒÅBÉCÉxÉìÉgÇÕí èÌÇÃÉCÉxÉìÉgÉãÅ[ÉvåoóRÇ≈èàóùÇ≥ÇÍÇ‹ÇπÇÒÅBÇ‹ÇΩÅAÉ_ÉCÉAÉçÉOÇ…ëŒÇ∑ÇÈÉCÉxÉìÉgÇÃǛDžǩǩÇÌǡǃǢÇÈÇΩÇflÅAǮǪÇÁÇ≠çXêVÇíÒãüÇ∑ÇÈDZÇΔLJǻǢÇÕÇ∏Ç≈Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAçXêVÉCÉxÉìÉgÇ™çƒëóêMÇ≥ÇÍë±ÇØÇÈÇΔǢǧñ‚ëËÇ™î≠ê∂ǵNjÇ∑ÅBçXêVÇí‚é~Ç∑ÇÈÇΩÇæ 1 ǬÇÃï˚ñ@ÇÕÅAâeãøÇéÛÇØÇÈÉEÉCÉìÉhÉEÇÃçXêVóÃàÊÇï`âÊÉãÅ[É`ÉìÇà Begin/EndUpdate åƒÇ—èoǵDžÇÊǡǃÉNÉäÉAÇ∑ÇÈDZÇΔÇ≈Ç∑ (ÅwInside Macintosh:Mactintosh Toolbox EssentialsÅxÇÃÅuHandling Update EventsÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢)ÅB

DZÇÃèÛãµÇÕÅAÉXÉNÉäÅ[ÉìÉZÅ[ÉoÅ[Ç‚ÉoÉãÅ[ÉìÉwÉãÉvÇ…ÇÊǡǃÇ≥ÇÁÇ…à´âªÇµÇ‹Ç∑ÅBÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇ™ï\é¶Ç≥ÇÍǃǢÇÈÇΔÇ´Ç…ÉXÉNÉäÅ[ÉìÉZÅ[ÉoÅ[Ç™ÉAÉNÉeÉBÉuDžǻǡÇΩÇËÅAÉÜÅ[ÉUÇ™ÉoÉãÅ[ÉìÉwÉãÉvÇégǡǃǢǃÅAÉ_ÉCÉAÉçÉOÇÃîwå„DždžÇÈÉEÉCÉìÉhÉEÇÃàÍïîÇ™ÉoÉãÅ[ÉìÇ…ÇÊǡǃâBÇ≥ÇÍÇÈèÍçáÅAÉEÉCÉìÉhÉEÇ…ëŒÇ∑ÇÈçXêVÉCÉxÉìÉgÇ™ê∂ê¨Ç≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ

Å@

çXêVÇΔ ModalDialog

ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëŒÇ∑ÇÈçXêVÉCÉxÉìÉgÇÃÉyÉìÉfÉBÉìÉOÇ™ë∂ç›Ç∑ÇÈèÍçáÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÅAÉhÉâÉCÉoÅAÉRÉìÉgÉçÅ[ÉãÉpÉlÉãÅAdžÇÈÇ¢ÇÕǪÇÃëºÇÃÉvÉçÉZÉXÇÕéûä‘ÇéÊìæÇµÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅB

ëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëŒÇ∑ÇÈçXêVÇÃÉyÉìÉfÉBÉìÉOÇÕàÍî Ç…ñ‚ëËÇÃå¥àˆÇΔÇÕÇ»ÇËÇ‹ÇπÇÒ (ǪÇÍÇÁLJNjÇΩçXêVÇÃÉyÉìÉfÉBÉìÉOÇÃâeãøÇéÛÇØÇƒÇ¢Ç»Ç¢Ç©Ç¨ÇË)ÅBDZÇÍÇÁÇÃçXêVÇÕÅAÉoÉbÉNÉOÉâÉEÉìÉhÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃí èÌí ÇËÇ…èàóùÇ≥ÇÍÇ‹Ç∑ÅBçXêVÇíÒãüÇµÇ»ÇØÇÍÇŒÅAëºÇÃÉvÉçÉZÉXÇÕéûä‘ÇéÊìæÇµÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅB

DZÇÃDZÇΔÇ™êˆç›ìIÇ»ñ‚ëËÇÃå¥àˆÇ…Ç»ÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBÉRÅ[ÉhÇÃëΩÇ≠ÇÃïîï™ÇÕÅAê≥èÌÇ…ìÆçÏǵÇΩÇËÅAÉlÉbÉgÉèÅ[ÉNê⁄ë±Çà€éùǵÇΩÇËÅAdžÇÈÇ¢ÇÕê≥èÌÇ»âÊñ ï\é¶ÇçsǧÇΩÇflÇ…éûä‘ÇïKóvÇΔǵNjÇ∑ÅB

íPèÉÇ»ó·ÇÕÅuÉZÉåÉNÉ^ÅvÇ≈Ç∑ÅBÅuÉZÉåÉNÉ^ÅvÇëIëǵÇΩå„ÅAÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇéùǬÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÇƒÇ›ÇƒÇ≠ÇæÇ≥Ç¢ÅBÅuÉZÉåÉNÉ^ÅvÇìKêÿÇ»à íuÇ…à⁄ìÆÇ∑ÇÍÇŒÅAÉoÉbÉNÉOÉâÉEÉìÉhDždžÇÈä‘Ç≈LJÅAǪÇÃÉäÉXÉgÇ™çXêVÇ≥ÇÍÇÈDZÇΔÇ…ãCÇ√Ç≠ÇÕÇ∏Ç≈Ç∑ÅB

DZDZÇ≈ÅAç≈ëOñ Ç…džÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç≈èëófiÉEÉCÉìÉhÉEÇ™äJǢǃǢÇÈDZÇΔÇämîFǵÅAÅuÉwÉãÉvÅvÉÅÉjÉÖÅ[ÇÃÅuÉoÉãÅ[Éìï\é¶ÅvÇÉIÉìDžǵNjÇ∑ÅB

ÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç≈ÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇäJÇ´Ç‹Ç∑ (ÇΩǢǃǢÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÅu... DžǬǢǃÅvÉ_ÉCÉAÉçÉOÇÕÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇΔǵǃìÆçÏǵNjÇ∑)ÅBDZDZÇ≈ÅAÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇÃîwå„DždžÇÈÉEÉCÉìÉhÉEÇÃè„Ç…ÉJÅ[É\ÉãÇà⁄ìÆÇµÇƒÇ›Ç‹Ç∑ÅBÅuâÊñ è„Ç…É_ÉCÉAÉçÉOǙdžÇÈÇÃÇ≈ÅADZÇÃÉEÉCÉìÉhÉEÇÕàÍî‘éËëOÇ…ï\é¶Ç≥ÇÍǃǢNjÇπÇÒÅB...ÅvǻǫÇÃèÓïÒÇä‹ÇfiÉoÉãÅ[ÉìÇ™ï\é¶Ç≥ÇÍÅAÉEÉCÉìÉhÉEÇÃàÍïîÇ™ÉoÉãÅ[ÉìÇ…ÇÊǡǃâBÇ≥ÇÍÇ‹Ç∑ÅBDZDZÇ≈ÅAÅuÉZÉåÉNÉ^ÅvÇå©ÇƒÇ≠ÇæÇ≥Ç¢ÅBÅuÉZÉåÉNÉ^ÅvÇÕé¿çsÇí‚é~ǵǃǢNjÇ∑ÅBÉoÉãÅ[ÉìÇ…ÇÊǡǃçUåÇÇéÛÇØÇΩÉEÉCÉìÉhÉEÇÕǪÇÍÇ…ëŒÇ∑ÇÈçXêVÇÃÉyÉìÉfÉBÉìÉOÇçsǡǃǮÇËÅAǪÇÃçXêVÇÕÉvÉçÉOÉâÉÄÇÃÉCÉxÉìÉgÉãÅ[ÉvåoóRÇ≈ÇÕÇ»Ç≠ÅAModalDialog ÉgÉâÉbÉvåoóRÇ≈é¿çsÇ≥ÇÍÇÈÇΩÇflÅAçXêVÇÕíÒãüÇ≥ÇÍÇ‹ÇπÇÒÅBǪÇÃåãâ ÅAëºÇÃÇ∑Ç◊ǃÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëŒÇµÇƒéûä‘ÇÕí‚é~ǵNjÇ∑ÅB

íçà”:
DZÇÃÇÊǧǻåªè€ÇÕÅAçXêVÇ™É_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇΔìØÇ∂ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇÈèÍçáÇ…ÇÃÇ›î≠ê∂ǵNjÇ∑ÅBï ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉì (Finder ǻǫ) ÇÃÉEÉCÉìÉhÉEÇÉoÉãÅ[ÉìÇ≈âBǵǃǢÇÈèÍçáÅAǪÇÃçXêVÇÕê≥èÌÇ…èàóùÇ≥ÇÍÇ‹Ç∑ÅB

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ

Å@

ñ‚ëËÇâÒîÇ∑ÇÈãÔëÃìIÇ»ï˚ñ@

DZÇÃÇÊǧǻåªè€ÇÃî≠ê∂ÇîÇØÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç≈ÇΔÇËǧÇÈ 2 ǬÇÃëIëéàǙdžÇËÇ‹Ç∑ÅBÇ‹Ç∏ëÊ 1 ÇÃëIëéàÇÕÅAÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇäJÇ≠ÇΔÇ´Ç…ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç…ëºÇÃÉIÅ[ÉvÉìÉEÉBÉìÉhÉEÇécÇ≥ǻǢÇΔǢǧï˚ñ@Ç≈Ç∑ÅBǵǩǵÅADZÇÃëIëéàÇ™èÌÇ…åªé¿ìIÇ»âåàï˚ñ@ÇΔǢǶǻǢDZÇΔÇÕñæÇÁÇ©Ç≈Ç∑ÅB

ÇÊÇËê≥ǵǢëÊ 2 ÇÃâåàï˚ñ@ÇÕÅAÉÇÅ[É_ÉãÉ_ÉCÉAÉçÉOÇÃì‡ïîÇ©ÇÁÇ∑Ç◊ǃÇÃÉEÉBÉìÉhÉEÇÃçXêVÇçsǧÇÊǧǻÉÅÉJÉjÉYÉÄÇé©ÇÁíÒãüÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB

ÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉ (ÅwInside Macintosh:Macintosh Toolbox EssentialsÅxÇÃÅuWriting an Event Filter Function for Alert and Modal Dialog BoxesÅvÇ≈ê‡ñæÇ≥ÇÍǃǢNjÇ∑) ÇÕÅADZÇÃñ‚ëËÇÃâåàÇ…égópÇ≈Ç´ÇÈìKêÿÇ»ÉcÅ[ÉãÇΔǢǶNjÇ∑ÅBDZÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìì‡Ç…ï\é¶Ç∑ÇÈÇ∑Ç◊ǃÇÃÉ_ÉCÉAÉçÉOÇ‹ÇΩÇÕÉAÉâÅ[ÉgÇ…íPèÉÇ»ÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉÇí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBǵǩLJÅAëÂïîï™ÇÃÉPÅ[ÉXÇ≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ_ÉCÉAÉçÉOÇ…ìØÇ∂ÉtÉBÉãÉ^Çí«â¡Ç≈Ç´ÇÈÇΩÇflÅAó]ï™Ç»ÉRÅ[ÉhÇëÂó Ç…èëÇ≠ïKóvLJdžÇËÇ‹ÇπÇÒÅB

ÇΩÇæÇµÅADZÇÃëIëéàÇçÃópÇ∑ÇÈÇΔÇ´Ç…ÇÕé·ä±ÇÃèÄîıÇ™ïKóvÇ…Ç»ÇËÇ‹Ç∑ÅBÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉÇÕÅAîCà”ÇÃÉEÉCÉìÉhÉEÇ…ëŒÇ∑ÇÈï`âÊÉvÉçÉVÅ[ÉWÉÉÇåƒÇ—èoÇ∑ï˚ñ@ÇéùÇ¡ÇƒÇ¢Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÍÇé¿åªÇ∑ÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉììΔé©ÇÃïKóvèåèÇ‚ÉfÉxÉçÉbÉpÇÃÉvÉçÉOÉâÉ~ÉìÉOÉXÉ^ÉCÉãÇ…ÇÊǡǃÅAÇ≥NjǥNjǻï˚ñ@Ç™ë∂ç›ÇµÇ‹Ç∑ÅBï`âÊÉãÅ[É`ÉìÇ÷ÇÃÉ|ÉCÉìÉ^Çä‹ÇfiÉEÉCÉìÉhÉEÉRÉìÉgÉçÅ[ÉãÉIÉuÉWÉFÉNÉgÇçÏê¨ÇµÇƒÇ‡Ç©Ç‹Ç¢Ç‹ÇπÇÒǵÅAÉÅÉCÉìÉCÉxÉìÉgÉãÅ[ÉvÇ≈çsǡǃǢÇÈÇÃÇΔìØÇ∂É`ÉFÉbÉNÇΔÉfÉBÉXÉpÉbÉ`ÇëgÇ›çûÇÒÇ≈LJǩNjǢNjÇπÇÒÅBÇ‹ÇΩÅAç≈ìKÇ≈džÇÈÇΔévÇÌÇÍÇÈï ÇÃï˚ñ@ÇégópÇ∑ÇÈDZÇΔLJâ¬î\Ç≈Ç∑ÅB

ç≈LJÉVÉìÉvÉãÇ≈äÓñ{ìIÇ»ï˚ñ@ÇÕÅAéüÇ…é¶Ç∑ÇÊǧDžÅAÉEÉCÉìÉhÉEÉåÉRÅ[Éh refCon ÇÃíÜÇ…ï`âÊÉvÉçÉVÅ[ÉWÉÉÇ…ëŒÇ∑ÇÈÉtÉâÉOÇëgÇ›çûÇ›ÅArefCon ÇÃílÇ…äÓÇ√Ç¢ÇΩìΔé©ÇÃï`âÊÉãÅ[É`ÉìÉxÉNÉ^ÇéùǬDZÇΔÇ≈Ç∑ÅB

/* ǫDZǩï ÇÃèÍèäÇ≈íËã`Ç≥ÇÍǃǢÇÈÉEÉCÉìÉhÉEï`âÊÉvÉçÉVÅ[ÉWÉÉ */
Boolean MyDrawProc (WindowPtr windowToDraw) {
 Boolean returnVal = true;
 Å@
 /* ǪÇÍà»ëOÇ…ÉEÉCÉìÉhÉEÇ…äiî[ǵǃǢÇΩílÇ */
 /* ÉIÉtÇ…Ç∑ÇÈ */
 switch (GetWRefCon(windowToDraw)) {
  case kMyClipboard: /* é©ï™ÇÃÉNÉäÉbÉvÉ{Å[ÉhÇï`âÊÇ∑ÇÈ */
   DrawMyClip (windowToDraw);
   break;
  case kMyDocument: /* èëófiÇÃì‡óe */
   DrawMyDoc (windowToDraw);
   break;
  default: /* ÉEÉCÉìÉhÉEÇÃï`âÊÇîÇØÇÈÇΩÇflÇ…ÅAëºÇÃDZÇΔÇÕâΩLJçsÇÌǻǢ */
   returnVal = false;
   /* DZÇÍÇÕé©ï™Ç…ä÷åWǻǢ */
   break;
 }
 Å@
 /* DZÇÃñflÇËílÇÕÅAÉtÉBÉãÉ^ì‡ïîÇ©ÇÁ Dialog Manager Ç */
 /* åƒÇ—èoǵÇΩÇΔÇ´Ç…ÅAçXêVÇèàóùǵÇΩǩǫǧǩÇ Dialog Manager Ç… */
 /* í ímÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÅBí èÌÇÃégóp (ǬNjÇËÅAÉÅÉCÉìÉCÉxÉìÉgÉãÅ[Év */
 /* Çà updateEvent Ç÷ÇÃâûìö) Ç≈ÇÕÅADZÇÃò_óùílÇÕïKóvǻǢǙÅA */
 /* ì¡Ç…âΩÇÁÇ©ÇÃè·äQÇ…Ç»ÇÈDZÇΔLJǻǢ */
 Å@
 return (returnVal);
}

ÉEÉBÉìÉhÉEÇçÏê¨Ç∑ÇÈÇΔÇ´Ç…ÉtÉâÉOÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅB

myWindowPtr = GetNewWindow (kMyWindowID, nil, (WindowPtr)-1);
SetWRefCon (myWindowPtr, (long)myDrawingProcFlag);

ÉtÉBÉãÉ^ì‡ÇÃçXêVèàóùÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

/* çXêVÇ™É_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇÈèÍçáÅAí èÌÇà ModalDialog ÇÕ
ïKóvÇ…âûÇ∂ǃÉ_ÉCÉAÉçÉOÇÃçƒï`âÊÇçsǧÇΩÇflÅADZÇÃçXêVÇñ≥éãÇ∑ÇÈ */
if(theEventIn->what == updateEvt && theEventIn->message != myDialogPtr ) {
 /* ìΔé©ÇÃï`âÊÉãÅ[É`ÉìÇ…ì¸ÇÈÅBëŒè€ÇΔÇ»ÇÈÉEÉCÉìÉhÉEÇèäóLǵǃǢÇÈèÍçáÇÕÅA
 ǪÇÃÉEÉCÉìÉhÉEÇ™çƒï`âÊÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇÈ */
 return (MyDrawProc ((WindowPtr)theEventIn->message));
}

MPW Pascal ÇÃèÍçá

{ DZÇÃä÷êîÇÃñflÇËílÇÕÅAÉtÉBÉãÉ^ì‡ïîÇ©ÇÁ Dialog Manager ÇåƒÇ—èoǵÇΩÇΔÇ´Ç…ÅA }
{ çXêVÇèàóùǵÇΩǩǫǧǩÇ Dialog Manager Ç…í ímÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÅB }
{ í èÌÇÃégóp (ǬNjÇËÅAÉÅÉCÉìÉCÉxÉìÉgÉãÅ[ÉvÇà updateEvent Ç÷ÇÃâûìö) Ç≈ÇÕÅA }
{ DZÇÃò_óùílÇÕïKóvǻǢǙÅAì¡Ç…âΩÇÁÇ©ÇÃè·äQÇ…Ç»ÇÈDZÇΔLJǻǢÅB }
{ ÉEÉCÉìÉhÉEÇÃçƒï`âÊÉvÉçÉVÅ[ÉWÉÉÇÕǫDZǩï ÇÃèÍèäÇ≈íËã`Ç≥ÇÍǃǢÇÈ }
Å@
FUNCTION MyDrawProc(windowToDraw WindowPtr): BOOLEAN;
Å@
BEGIN
 CASE GetWRefCon(windowPtr) OF
 Å@
  kMyClipboard:
  BEGIN
   DrawMyClipboard(windowToDraw);
   MyDrawProc := TRUE;
  END;
  Å@
  kMyDocument:
  BEGIN
   DrawMyDocument(windowToDraw);
   MyDrawProc := TRUE;
  END;
  Å@
  OTHERWISE
   MyDrawProc := FALSE;
 END; {CASE}
END;

ÉEÉBÉìÉhÉEÇçÏê¨Ç∑ÇÈÇΔÇ´Ç…ÉtÉâÉOÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅB

myWindowPtr := GetNewWindow(kMyWindowID, NIL, WindowPtr(-1));
SetWRefCon(myWindowPtr, myDrawingProcFlag);

ÉtÉBÉãÉ^ì‡ÇÃçXêVèàóùÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

FUNCTION MyFilter(currentDialog: DialogPtr; VAR theEventIn: EventRecord;
VAR theItem: INTEGER): BOOLEAN;
Å@
{ çXêVÇ™É_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇÈèÍçáÅAí èÌÇà ModalDialog ä÷êîÇÕ }
{ ïKóvÇ…âûÇ∂ǃÉ_ÉCÉAÉçÉOÇÃçƒï`âÊÇçsǧÇΩÇflÅADZÇÃçXêVÇñ≥éãÇ∑ÇÈ }
Å@
BEGIN
Å@
 IF (theEventIn.what = updateEvt AND theEventIn.message <> currentDialog)
  BEGIN
   MyFilter := MyDrawProc(currentDialog);
  END;
END;

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ

Å@

Ç≥ÇÁÇ…ïKóvÇΔÇ»ÇÈèàóù

ìΔé©ÇÃÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉÇÉ_ÉCÉAÉçÉOÇ…í«â¡Ç∑ÇÈDZÇΔÇ…ëŒÇ∑ÇÈóBàÍÇÃñ‚ëËÇÕÅAÉfÉxÉçÉbÉpÇ™çXêVÇæÇØÇ≈Ç»Ç≠ǪÇÃëºÇÃèàóùLJçsǧDZÇΔÇ Dialog Manager Ç™ëOíÒDžǵǃǵNjǧì_DždžÇËÇ‹Ç∑ÅBì¡Ç… Dialog Manager Ç≈ÇÕÅAÉfÉxÉçÉbÉpÇ™ïWèÄìIÇ»Åuitem 1 Ç÷Çà return ÉLÅ[ÉGÉCÉäÉAÉXÅvÇÃÉtÉBÉãÉ^èàóùÇé¿çsǵǃǢÇÈÇΔëzíËǵNjÇ∑ÅBDZÇÃÇΩÇflÅAÉfÉxÉçÉbÉpÇÕÉLÅ[ëÄçÏÇÃèàóùÇé©ÇÁÉtÉBÉãÉ^ì‡Ç…èëÇ©Ç»ÇØÇÍnjǻÇÁÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅB

System 7 Çà Dialog Manager Ç…ÇÕÅADZÇÃèÛãµÇ≈ÉvÉçÉOÉâÉÄÇ…ëŒÇ∑ÇÈïââ◊Çåyå∏Ç∑ÇÈÅAÇ¢Ç≠ǬǩÇÃêVǵǢåƒÇ—èoǵǙópà”Ç≥ÇÍǃǢNjÇ∑ÅBDZÇÍÇÁÇÃåƒÇ—èoǵÇÕÅASystem 7 ÇäJî≠Ç∑ÇÈç≈èIíiäKÇ≈çÏê¨Ç≥ÇÍǃÉeÉXÉgÇ≥ÇÍÇΩÇΩÇflÅAÅwInside MacintoshÅxÇ…ÇÕè⁄ç◊Ç…ãLèqÇ≥ÇÍǃǢNjÇπÇÒÅBDZÇÃÇÊǧǻóùóRÇ©ÇÁÅwInside MacintoshÅxÇï‚ë´Ç∑ÇÈñ⁄ìIÇ≈ÅuTechnote 1148: Dialog Manager ÇÃÉwÉãÉpä÷êîÅvÇ™ópà”Ç≥ÇÍǃǢNjÇ∑ÅBDZÇÍÇÁÇÃä÷êîÇégópÇ∑ÇÈÇΔÅASystem ÇÃÉTÅ[ÉrÉXÇåƒÇ—èoǵǃÅAÉ_ÉCÉAÉçÉOì‡Ç≈ÇÃïWèÄìIÇ»ÉLÅ[ëÄçÏÇí«ê’Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

System 6 Ç≈ÇÃèàóùï˚ñ@

Ç‡ÇøÇÎÇÒÅASystem 7 ÇÊÇËëOÇÃÉVÉXÉeÉÄÇ…ëŒâûǵÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅADZÇÍÇÁÇÃêVǵǢåƒÇ—èoǵÇégópÇ≈ǴǻǢÇΩÇflÅAÉfÉxÉçÉbÉpé©êgÇ™Ç∑Ç◊ǃÇÃèàóùÇçsǧïKóvǙdžÇËÇ‹Ç∑ÅBéüÇ…ÅASystem 7 ÇÃÉtÉBÉãÉ^ÇΔÇŸÇ⁄ìØÇ∂èàóùÇçsǧ System 6.0.x Ç…ëŒâûǵÇΩÉtÉBÉãÉ^ÉvÉçÉVÅ[ÉWÉÉÇÃÉTÉìÉvÉãÇé¶ÇµÇ‹Ç∑ÅB

/* System 7 ÇÊÇËëOÇÃÉVÉXÉeÉÄÇ…ëŒâûǵÇΩÉ_ÉCÉAÉçÉO ÉtÉBÉãÉ^ */
#define kMyButtonDelay 8
Å@
/* ÉcÅ[ÉãÉ{ÉbÉNÉXÇ…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈÇΩÇflÅA'pascal' ÇΔǵǃêÈåæÇ∑ÇÈ */
pascal Boolean MyFilter (DialogPtr currentDialog,
EventRecord *theEventIn, short *theDialogItem) {
 Boolean returnVal = false;
 long waitTicks;
 short itemKind; /* GetDItem Ç≈égópÇ∑ÇÈÇ¢Ç≠ǬǩÇÃÉeÉìÉ|ÉâÉäïœêî */
 Handle itemHandle;
 Rect itemRect;
 Å@
 if (theEventIn->what == updateEvt && theEventIn->message != myDialogPtr) {
  /* myDialogPtr ÇÕÉ_ÉCÉAÉçÉOÇçÏê¨ÇµÇΩèÍèäÇ≈íËã`Ç≥ÇÍǃǢÇÈÅB
  çXêVÇ™É_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇÈèÍçáÅAí èÌÇà ModalDialog ÇÕ
  ïKóvÇ…âûÇ∂ǃÉ_ÉCÉAÉçÉOÇÃçƒï`âÊÇçsǧÇΩÇflÅADZÇÃçXêVÇñ≥éãÇ∑ÇÈ */
  Å@
  returnVal = MyDrawProc (theEventIn->message); /* ìΔé©ÇÃï`âÊÉãÅ[É`ÉìÇ…ì¸ÇÈ */
 } else {
  /* ǪÇÍÇ™çXêVÇ≈Ç»ÇØÇÍÇŒÅAÉLÅ[ëÄçÏÇ≈džǡÇΩǩǫǧǩÇämîFÇ∑ÇÈÅBreturn Ç‹ÇΩÇÕ enter ÉLÅ[
  ÇÉ`ÉFÉbÉNǵÅAitem 1 ÇΔǵǃǪÇÃÉGÉCÉäÉAÉXÇçÏê¨Ç∑ÇÈÅBÇ‹ÇΩÅADZDZDžÇÕ item 2 ÇÃÉGÉCÉäÉAÉX
  ÇçÏê¨Ç∑ÇÈ escape ÉLÅ[Ç…ëŒÇ∑ÇÈÉ`ÉFÉbÉNLJëgÇ›çûÇÒÇ≈Ç¢ÇÈÇ™ÅAïKÇ∏ǵLJDZÇÍÇégópÇ∑ÇÈïKóvÇÕ
  ǻǢ */
  Å@
  if ((theEventIn->what == keyDown) || (theEventIn->what == autoKey)) {
   /* ǪÇÍÇÕÉLÅ[ÇæÇ¡ÇΩ */
   Å@
   switch (theEventIn->message & charCodeMask) {
    case kReturnKey:
    case kEnterKey:
    *theDialogItem = ok; /* åªç›ÇÃçÄñ⁄Ç™âΩÇ≈džǡǃLJ "OK" çÄñ⁄Ç…ïœçXÇ∑ÇÈÅB
                          ok ÇÕ Dialogs.h Ç≈íËã`Ç≥ÇÍǃǢÇÈÅB
                          DZÇÃÇΔÇ´ÇÕÅAÉÜÅ[ÉUÇ™ê≥ǵǢÉtÉBÅ[ÉhÉoÉbÉNÇìæÇÁÇÍÇÈÇÊǧDžÅA
                          É{É^ÉìÇîΩì]Ç≥ÇπÇÈïKóvǙdžÇÈ */
     GetDItem (currentDialog, ok, &itemKind, &itemHandle, &itemRect);
     HiliteControl ((ControlHandle)itemHandle, inButton); /* É{É^ÉìÇîΩì]Ç≥ÇπÇÈ */
     Delay (kMyButtonDelay, &waitTicks); /* DZÇÍÇ™å©Ç¶ÇÈÇÊǧDžñÒ 8 ÉeÉBÉbÉNë“ã@Ç∑ÇÈ */
     HiliteControl ((ControlHandle)itemHandle, false); /* ǪÇÃå„ÅAí èÌÇÃèÛë‘Ç…ñflÇÈ */
    Å@
     returnVal = true; /* DZÇÃÉCÉxÉìÉgÇèàóùǵÇΩDZÇΔÇ Dialog Manager Ç…í ímÇ∑ÇÈ */
     break;
         
    /* DZÇÍÇÕÅAescape ÉLÅ[Ç… item 2 (í èÌÇÕ "ÉLÉÉÉìÉZÉã" É{É^Éì) ÇΔìØÇ∂ÉtÉBÉãÉ^èàóùÇçsǧ */
    case kEscKey:
     *theDialogItem = cancel; /* cancel ÇÕ Dialogs.h Ç≈ 2 ÇΔíËã`Ç≥ÇÍǃǢÇÈ */
     GetDItem (currentDialog, cancel, &itemKind, &itemHandle, &itemRect);
     HiliteControl ((ControlHandle)itemHandle, inButton);
     Delay (kMyButtonDelay, &waitTicks); /* DZÇÍÇ™å©Ç¶ÇÈÇÊǧDžñÒ 8 ÉeÉBÉbÉNë“ã@Ç∑ÇÈ */
     HiliteControl ((ControlHandle)itemHandle, false);
     Å@
     returnVal = true; /* DZÇÃÉCÉxÉìÉgÇèàóùǵÇΩDZÇΔÇ Dialog Manager Ç…í ímÇ∑ÇÈ */
     break;
   }
  }
 }
 Å@
 return (returnVal);
}

MPW Pascal ÇÃèÍçá

{ System 7 ÇÊÇËLJëOÇÃÉVÉXÉeÉÄÇ…ëŒâûǵÇΩÉtÉBÉãÉ^ÇÕéüÇÃÇÊǧDžǻÇÈ }
Å@
FUNCTION MyFilter(currentDialog: DialogPtr; VAR theEventIn:
 EventRecord; VAR theItem: INTEGER): BOOLEAN;
CONST
 kMyButtonDelay = 8;
 VAR
 itemKind : INTEGER;
 itemHandle : Handle;
 itemRect : Rect;
 savePort : GrafPtr;
 waitTicks : LONGINT;
Å@
BEGIN
 { çXêVÇ™É_ÉCÉAÉçÉOÉ{ÉbÉNÉXÇ…ëŒÇ∑ÇÈLJÇÃÇ≈džÇÈèÍçáÅAí èÌÇà ModalDialog ä÷êîÇÕ }
 { ïKóvÇ…âûÇ∂ǃÉ_ÉCÉAÉçÉOÇÃçƒï`âÊÇçsǧÇΩÇflÅADZÇÃçXêVÇñ≥éãÇ∑ÇÈ }
 IF (theEventIn.what = updateEvt AND theEventIn.message <> currentDialog)
  MyFilter := MyDrawProc(theEventIn.message)
 ELSE { it wasn't an update, see if it was a keystroke }
 BEGIN
  { return Ç‹ÇΩÇÕ enter ÉLÅ[ÇÉ`ÉFÉbÉNǵÅA"ok" çÄñ⁄ÇΔǵǃǪÇÃÉGÉCÉäÉAÉXÇçÏê¨Ç∑ÇÈ }
  { DZDZDžÇÕ "ÉLÉÉÉìÉZÉã" çÄñ⁄ÇÃÉGÉCÉäÉAÉXÇΔÇ»ÇÈ escape ÉLÅ[Ç…ëŒÇ∑ÇÈÉ`ÉFÉbÉNLJ }
  { ëgÇ›çûÇÒÇ≈Ç¢ÇÈÇ™ÅAïKÇ∏ǵLJDZÇÍÇégópÇ∑ÇÈïKóvÇÕǻǢ }
  IF ((theEventIn.what = keyDown) OR (theEventIn.what = autoKey))
   BEGIN { ǪÇÍÇÕÉLÅ[ÇæÇ¡ÇΩ }
   Å@
   CASE CHR(BAnd(theEventIn.message, charCodeMask)) OF
   Å@
    kReturnKey, kEnterKey:
     BEGIN
      GetDItem(currentDialog, ok, itemKind, itemHandle, itemRect);
      HiliteControl(ControlHandle(itemHandle), TRUE);
      Delay(kMyButtonDelay , waitTicks); { DZÇÍÇ™å©Ç¶ÇÈÇÊǧDžñÒ 8 ÉeÉBÉbÉNë“ã@Ç∑ÇÈ }
      HiliteControl(ControlHandle(itemHandle), FALSE); { ǪÇÃå„ÅAí èÌÇÃèÛë‘Ç…ñflÇÈ }
      MyFilter := TRUE; { DZÇÃÉCÉxÉìÉgÇèàóùǵÇΩDZÇΔÇ Dialog Manager Ç…í ímÇ∑ÇÈ }
     END;
    Å@
    kEscKey:
     BEGIN
      theItem := cancel;
      GetDItem(currentDialog, cancel, itemKind, itemHandle, itemRect);
      HiliteControl(ControlHandle(itemHandle), TRUE);
      Delay(kMyButtonDelay , waitTicks); { DZÇÍÇ™å©Ç¶ÇÈÇÊǧDžñÒ 8 ÉeÉBÉbÉNë“ã@Ç∑ÇÈ }
      HiliteControl(ControlHandle(itemHandle), FALSE); { ǪÇÃå„ÅAí èÌÇÃèÛë‘Ç…ñflÇÈ }
      MyFilter := TRUE; { DZÇÃÉCÉxÉìÉgÇèàóùǵÇΩDZÇΔÇ Dialog Manager Ç…í ímÇ∑ÇÈ }
     END;
   Å@
   END; {CASE}
  END;
 END;
END;

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ

Å@

åãò_

â ÇƒÇµÇ»Ç¢çXêVÇÕâΩLJêVǵǢñ‚ëËÇ≈ÇÕdžÇËÇ‹ÇπÇÒÇ™ÅAâ ÇƒÇµÇ»Ç¢çXêVDžǬǢǃâΩÇÁÇ©ÇÃëŒèàÇçsǧDZÇΔÇ™èdóvÇ≈Ç∑ÅBÇΔÇÕǢǶÅADZÇÃñ‚ëËÇ…ä÷ǵǃǪÇÍÇŸÇ«ó]ï™Ç»çÏãΔÇ™î≠ê∂Ç∑ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBÇ∑Ç◊ǃÇÃÉ_ÉCÉAÉçÉOÇ®ÇÊÇ—ÉAÉâÅ[ÉgÇ…íPèÉÇ»ÉtÉBÉãÉ^Çí«â¡ÇµÅAÉEÉCÉìÉhÉEç\ë¢ëÃÇÃíÜÇ…ï`âÊÉvÉçÉVÅ[ÉWÉÉÇ÷ÇÃÉtÉâÉOÇíuÇ≠ÇæÇØÇ≈Ç∑ÅB

ǪÇÃåãâ ÅAÉVÉXÉeÉÄÇÕâ~ääÇ…é¿çsÇåpë±Ç∑ÇÈÇÕÇ∏Ç≈Ç∑ÅBÇ‹ÇΩÅAåãâ ìIÇ…ÅAÉÜÅ[ÉUÇÕèÌÇ…ÅAàÍïîÇ™åáÇØÇΩÉEÉCÉìÉhÉEÇ≈ÇÕÇ»Ç≠ÅAñ{óàÇÃï˚ñ@Ç≈ï\é¶Ç≥ÇÍÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉEÉCÉìÉhÉEÇå©ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB

éQçlï∂å£

â¸í˘ÇÃóöó

  • 1991îN10åéÅADZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇÃèâî≈Ç™ÅuTechnote TB 37ÅvÇΔǵǃåˆäJÇ≥ÇÍNjǵÇΩÅB
  • 1991îNÇΔ1999îNÇ…ÉTÉìÉvÉãÉRÅ[ÉhÇÃí«â¡ÇΔâ¸í˘Ç™çsÇÌÇÍNjǵÇΩÅB
  • 1999îN1åéÅAíÒé¶ÇµÇΩÉAÉCÉfÉAÇÇÊÇËÇÊÇ≠êÆóùÇ∑ÇÈÇΩÇflÅADZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇÃì‡óeÇÕçXêVÇ≥ÇÍNjǵÇΩÅB

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ